/**
  ******************************************************************************
  * @file    dev_w25qxx.h
  * @author  Yun
  * @version V1.0.0
  * @date    2025-02-21
  * @brief   W25QXX设备驱动模块头文件
  * @license EULA (End User License Agreement)
  *          Copyright (c) 2025 星瑜科技自动化 Co., Ltd. All rights reserved.
  ******************************************************************************
  */

#ifndef FRAMEWORK_DEV_W25QXX_H
#define FRAMEWORK_DEV_W25QXX_H

#ifdef __cplusplus
extern "C" {
#endif

/*---------------------- 宏定义 ----------------------*/
#define W25Q_CMD_NULL           0x00 /*!< 空指令 */
#define W25Q_CMD_FULL           0xFF /*!< 读取填充指令 */
#define W25Q_CMD_READ_ID        0x90 /*!< 读取ID指令 */
#define W25Q_CMD_READ_DATA      0x03 /*!< 读取数据指令 */
#define W25Q_CMD_WRITE_ENABLE   0x06 /*!< 写使能指令 */
#define W25Q_CMD_WAIT_READY     0x05 /*!< 等待准备指令 */
#define W25Q_CMD_PAGE_PROGRAM   0x02 /*!< 页编程指令 */
#define W25Q_CMD_SECTOR_ERASE   0x20 /*!< 扇区擦除指令 */
#define W25Q_PAGE_SIZE          256  /*!< 页大小 */
#define W25Q_SECTOR_SIZE        4096 /*!< 扇区大小 */
#define W25Q_PAGE_NUM           16   /*!< 页数量 */
#define W25Q_TIMEOUT            100  /*!< 超时时间 */

/*---------------------- Includes ----------------------*/
#include "dev_common_type.h"

#include "spi_interface.h"

/**
  * @brief  W25QXX设备配置结构体
  */
typedef struct Dev_W25Q_Cfg{
    void* pHwCfg;                                    /*!< 硬件配置指针 */
    Spi_Interface_TypeDef* pstDevW25QInterface; /*!< 设备操作接口 */
    uint32_t u32FlashSize;                           /*!< 闪存容量 */
    uint8_t u8SectorCache[W25Q_SECTOR_SIZE];         /*!< 扇区缓存 */
    uint8_t u8InitState:1;                       /*!< 初始状态 */
    uint8_t u8RunState:1;                            /*!< 运行状态 */
    uint8_t u8LockState:1;                          /*!< 锁定状态 */
}Dev_W25Q_Cfg_TypeDef;

/*---------------------- 设备操作API ----------------------*/
/**
  * @brief  W25QXX设备操作函数
  * @param  pstDevW25QCfg: W25QXX设备配置
  * @param  pHwCfg: 硬件配置指针
  * @param  pstDevW25QInterface: 设备操作接口
  * @return DEV_Status_TypeDef 操作状态码
  */
uint8_t Dev_W25Q_Register(Dev_W25Q_Cfg_TypeDef* pstDevW25QCfg,
                          void* pHwCfg,
                          Spi_Interface_TypeDef* pstDevW25QInterface);

/**
  * @brief  W25QXX设备读取ID函数
  * @param  pstDevW25QCfg: W25QXX设备配置
  * @param  u16ChipID: 芯片ID
  * @return DEV_Status_TypeDef 操作状态码
  */
uint8_t Dev_W25Q_ReadID(Dev_W25Q_Cfg_TypeDef* pstDevW25QCfg,
                        uint16_t* u16ChipID);

/**
  * @brief  W25QXX设备读取数据函数
  * @param  pstDevW25QCfg: W25QXX设备配置
  * @param  u32Addr: 地址
  * @param  pu8Data: 数据
  * @param  u16Len: 数据长度
  * @return DEV_Status_TypeDef 操作状态码
  */
uint8_t Dev_W25Q_ReadData(Dev_W25Q_Cfg_TypeDef* pstDevW25QCfg,
                          uint32_t u32Addr,
                          uint8_t *pu8Data,
                          uint16_t u16Len);

/**
  * @brief  W25QXX设备擦除扇区函数
  * @param  pstDevW25QCfg: W25QXX设备配置
  * @param  u32Sector: 扇区号
  * @return DEV_Status_TypeDef 操作状态码
  */
uint8_t Dev_W25Q_EraseSector(Dev_W25Q_Cfg_TypeDef* pstDevW25QCfg,
                             uint32_t u32Sector);

/**
  * @brief  W25QXX设备写扇区函数
  * @param  pstDevW25QCfg: W25QXX设备配置
  * @param  u32Sector: 扇区号
  * @param  pu8Data: 数据
  * @return DEV_Status_TypeDef 操作状态码
  */
uint8_t Dev_W25Q_Write_Sector(Dev_W25Q_Cfg_TypeDef* pstDevW25QCfg,
                              uint32_t u32Sector,
                              uint8_t *pu8Data);

/**
  * @brief  W25QXX设备写数据函数
  * @param  pstDevW25QCfg: W25QXX设备配置
  * @param  u32Addr: 地址
  * @param  pu8Data: 数据
  * @param  u16Len: 数据长度
  * @return DEV_Status_TypeDef 操作状态码
  */
uint8_t Dev_W25Q_WriteData(Dev_W25Q_Cfg_TypeDef* pstDevW25QCfg,
                           uint32_t u32Addr,
                           uint8_t *pu8Data,
                           uint16_t u16Len);

#ifdef __cplusplus
}
#endif

#endif //FRAMEWORK_DEV_W25QXX_H

/************************ (C) COPYRIGHT 星瑜科技自动化 *****END OF FILE****/
